package demo01;

import java.util.LinkedList;

/*
 *  java.util.LinkedList集合 implements List接口
 *  LinkedList集合的特点：
 *      1. 底层是一个链表结构：查询慢，增删快
 *      2. 该集合包含了大量操作首尾元素的方法
 *      注意：使用LinkedList集合特有的方法，就不能使用多态
 *  
 *  LinkedList集合的特有方法：
 *      public void addFirst(E e)：将指定元素插入此列表的开头
 *      public void push(E e)：将元素推入此列表所表示的堆栈，此方法等效于addFirst
 *      public void addLast(E e)：将指定元素添加到此列表的结尾，此方法等效于add
 * 
 *      public E getFirst()：返回此列表的第一个元素
 *      public E getLast()：返回此列表的最后一个元素
 *      public boolean isEmpty()：如果列表不包含元素，则返回true
 * 
 *      public E removeFirst()：移除并返回此列表的第一个元素
 *      public E pop()：从此列表所表示的堆栈处弹出一个元素
 *      public E removeLast()：移除并返回此列表的最后一个元素
 */
public class Demo02LinkedList {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>(); // 创建LinkedList集合对象
        linkedList.add("土司鸡");
        linkedList.add("老虎");
        linkedList.add("粹花");
        System.out.println(linkedList); // [土司鸡, 老虎, 粹花]

        show01(linkedList); // 添加元素的方法
        show02(linkedList); // 取出元素的方法
        show03(linkedList); // 移除元素的方法

    }

    /*
     *  public E removeFirst()：移除并返回此列表的第一个元素
     *  public E pop()：从此列表所表示的堆栈处弹出一个元素，此方法等效于removeFirst
     *  public E removeLast()：移除并返回此列表的最后一个元素
     */
    private static void show03(LinkedList<String> linkedList) {
        // public E removeFirst()：移除并返回此列表的第一个元素
        String string = linkedList.removeFirst();
        System.out.println("被移除的第一个元素：" + string); // 土土
        // public E pop()：从此列表所表示的堆栈处弹出一个元素，此方法等效于removeFirst
        String string2 = linkedList.pop();
        System.out.println("被移除的第一个元素：" + string2); // 土提

        // public E removeLast()：移除并返回此列表的最后一个元素
        String string3 = linkedList.removeLast();
        System.out.println("被移除的最后一个元素：" + string3); // 提莫
        System.out.println(linkedList); // [土司鸡, 老虎, 粹花]
    }

    /*
     *  public E getFirst()：返回此列表的第一个元素
     *  public E getLast()：返回此列表的最后一个元素
     *  public boolean isEmpty()：如果列表不包含元素，则返回true
     */
    private static void show02(LinkedList<String> linkedList) {
        // public E getFirst()：返回此列表的第一个元素
        System.out.println(linkedList.getFirst()); // 土土
        // public E getLast()：返回此列表的最后一个元素
        System.out.println(linkedList.getLast()); // 提莫

        // public Object clone()：返回此LinkedList的浅表副本（即复制该列表）
        LinkedList<String> linkedList2 = (LinkedList<String>) linkedList.clone(); // 返回值因为是Object，所以需要使用(LinkedList<String>)前缀强转
        System.out.println(linkedList2); // [土土, 土提, 土司鸡, 老虎, 粹花, 提莫]，复制的列表内容不变
        // void clear()：从列表中移除所有元素
        linkedList2.clear();
        // System.out.println(linkedList2.getFirst()); // 此时再尝试获取元素，会抛出NoSuchElementException没有元素异常，为防止该异常，需要添加判断条件

        // public boolean isEmpty()：如果列表不包含元素，则返回true
        if (!linkedList2.isEmpty()) { // isEmpty在无元素时会返回true，因此判断时需要!取反
            System.out.println(linkedList2.getFirst());
        }
    }

    /*
     *  public void addFirst(E e)：将指定元素插入此列表的开头
     *  public void push(E e)：将元素推入此列表所表示的堆栈，此方法等效于addFirst
     *  public void addLast(E e)：将指定元素添加到此列表的结尾，此方法等效于add
     */
    private static void show01(LinkedList<String> linkedList) {
        // public void addFirst(E e)：将指定元素插入此列表的开头
        linkedList.addFirst("土提");
        System.out.println(linkedList); // [土提, 土司鸡, 老虎, 粹花]
        // public void push(E e)：将元素推入此列表所表示的堆栈，此方法等效于addFirst(E)
        linkedList.push("土土");
        System.out.println(linkedList); // [土土, 土提, 土司鸡, 老虎, 粹花]

        // public void addLast(E e)：将指定元素添加到此列表的结尾，此方法等效于add
        linkedList.addLast("提莫");
        System.out.println(linkedList); // [土土, 土提, 土司鸡, 老虎, 粹花, 提莫]
    }
}
